#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>


#include "semaforos.h"

#define erro_param "consumidor [-c num_consumidores -veces num_veces]"

int nconsumidores = 0;
int veces = 0;

void consumirItem(char item) {
	srand(getpid());
	int aleat = 1 + (int) (5.0 * (rand() / (RAND_MAX + 1.0)));
	sleep(aleat);
}

char obterItem() {
	char mensaje [300];
	time_t t;
	pid_t p;
	p=getpid();
	t=time(NULL);
	sprintf(mensaje, "CONSUMIDOR (%u): Comeza a obte-lo item as %s", p, ctime(&t));
	write(0, mensaje, strlen(mensaje));
	
	char item;
	if ((item = extraeDaCola()) == -1) {
		sprintf(mensaje, "Buffer baleiro. Non se pode consumir.\n");
		write(0, mensaje, strlen(mensaje));
	}
	
	sprintf(mensaje, "Item consumido polo CONSUMIDOR(%i): %c\n", p, item);
	write(0, mensaje, strlen(mensaje));

	mostrarBuffer();

	//Se cadra fai falla un sleep aqui, porque os consumidores entran dentro do mesmo segundo
	//sleep(1);

	t=time(NULL);
	sprintf(mensaje, "CONSUMIDOR (%u): Remata de obte-lo item as %s\n", p, ctime(&t));
	write(0, mensaje, strlen(mensaje));
	return item;
}

int main(int argc, char *argv[]) {
	/** VERIFICACION DE PARAMETROS **/
	switch (argc) {
	case 5:
		if (strcmp(argv[1], "-c") || strcmp(argv[3], "-veces"))
			sair(MAL_PARAM, erro_param);
		nconsumidores = atoi(argv[2]);
		veces = atoi(argv[4]);
		if (nconsumidores < 1 || veces < 1)
			sair(MAL_PARAM, erro_param);
		break;
	default:
		sair(MAL_PARAM, erro_param);
	}
	/** FIN DA VERIFICACION DE PARAMETROS **/

	/** CREACION DE CONSUMIDORES**/
	pid_t pid;
	int i;
	for (i = 0; i < nconsumidores; i++) {
		pid = fork();
		if (pid == 0)
			break;
	}
	/** FIN DA CREACION DE CONSUMIDORES**/

	char item;
	if (pid == 0) {
		while (veces--) {
			P(CHEO);
			P(MUTEX);
			item = obterItem();
			V(MUTEX);
			V(BALEIRO);
			consumirItem(item);
		}
	} else {
		getchar();
	}
	return (EXIT_SUCCESS);
}

